// 判断是否为对象
function isObject(obj){
    if (typeof obj === 'object'&&obj !==null&&obj.constructor === Object) {
        return true
    } else {
        return false
    }
}

/**
 * {object} options 参数对象
 * options对象
 *  {string} url 请求地址
 *  {string} type 请求方式
 *  {string|object} data 请求参数
 *  {Boolean} cache 是否使用缓存
 *  {string} dataType 返回的数据类型
 *  {function} success 成功的回调函数
 *  {function} error 失败的回调函数
*/
function ajax(options){
    // 1. 创建数据交互对象XMLHttpRequest对象（ajax对象）
    var xhr = new XMLHttpRequest()//除了IE56都支持
    // var xhr = new ActiveXObject('Microsoft.XMLHTTP')//ie56支持

    // 判断data参数数据类型 string or object
    
    var data = ''//保存格式化之后的参数 options.data
    if (typeof options.data === 'string') {
        // 如果是字符串不做任何处理，直接赋值
        data = options.data
    }
    if (isObject(options.data)) {
        // 如果options.data是对象，则格式化为字符串 'user=xiapcuo&pass=123456'
        for (var key in options.data){
            data += (key+'='+options.data[key]+'&')
        }
        // data = 'user=xiapcuo&pass=123456&'
        // 去掉最后一个&
        // data = data.substr(0,data.length-1)
        data = data.substring(0,data.length-1)
    }

    // 判断请求方式
    if (options.type.toLowerCase() === 'get') {
        // 是否使用缓存
        if (options.cache) {
            // 2. 初始化请求
            xhr.open(options.type,options.url+'?'+data,true)
        } else {
            // 2. 初始化请求
            xhr.open(options.type,options.url+'?'+data+'&_='+Date.now(),true)
        }
        // 3. 发送请求
        xhr.send(null)//get请求
    } else if (options.type.toLowerCase() === 'post'){
        // 2. 初始化请求
        xhr.open(options.type,options.url,true)
        // 设置请求头，作用是 模拟表单的post方式提交数据
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
        // 3. 发送请求
        // post请求在此传参
        xhr.send(data)
    } else {
        alert('目前仅支持get或post请求！')
        return
    }

    // 4. 监听 请求状态 响应状态
    // xhr.readyState 代表请求状态 0-4
    // 当 xhr.readyState 请求状态发生改变时，会触发一个事件 readyStateChange
    xhr.onreadystatechange = function (){
        // console.log( xhr.readyState )// 2 3 4
        if (xhr.readyState === 4){//请求完成
            // 这时还不能拿到数据
            // console.log( xhr.status )//http响应状态码
            if (xhr.status >= 200 && xhr.status < 300) {
                if (options.dataType === 'json') {
                    // 如果是 json 数据，解析成对象之后再传出
                    var json = JSON.parse(xhr.responseText)
                    options.success(json)
                } else if (options.dataType === 'xml'){
                    options.success(xhr.responseXML)
                } else {
                    options.success(xhr.responseText)
                }
            } else {
                options.error(xhr.status)
            }
        }
    }
}


